/*
 * @description: 路由权限 -动态路由
 * @Author: Islands
 * @Date: 2024-03-25 15:25:43
 * @LastEditTime: 2024-03-25 20:52:30
 */
import router from '@/router/index';
import NProgress from 'nprogress';  //进度条组件
import 'nprogress/nprogress.css';   //进度条组件样式
import { whiteList } from '@/constant/white/index';
import { useAuthStore } from "@/store";


/**
 * @description: 1.前置守卫
 * @author: Islands
 * @param {*} to 即将要进入的目标
 * @param {any} from 当前导航正要离开的路由
 * @param {any} next    路由的控制参数，常用的有next(true)和next(false)
 * @return {*}
 */
router.beforeEach(async (_to: any, _from: any, _next: any) => {
    NProgress.start();
    let hasToken = localStorage.getItem("accessToken")
    //if 账户未登录处理 else 已登录处理
    if (!hasToken) {
        // if 是白名单用户->放行 else 重定向到 -> /login
        if (whiteList.includes(_to.path)) {
            _next()
        } else {
            _next(`/login`);
        }
    } else {
        // if已登录还在访问 ‘/login’ 则直接进入首页,else 根据角色权限加载动态路由
        if (_to.path === '/login') {
            _next({ path: "/home" });
        } else {
            const { userInfo } = useAuthStore().$state;
            const hasRoles = userInfo.roles && userInfo.roles.length > 0;
            if (hasRoles) {
                // 未匹配到任何路由，跳转404
                if (_to.matched.length === 0) {
                    _from.name ? _next({ name: _from.name }) : _next("/404");
                } else {
                    _next();
                }
            } else {
                try {
                    //获取到角色id集
                    const { roles } = await useAuthStore().getUserInfo();
                    //根据角色查询权限集合(获取路由)
                    const accessRoutes = await useAuthStore().getRoutes(roles);
                    //添加路由
                    accessRoutes.forEach((route: any) => {
                        router.addRoute(route);
                    });
                    _next({ ..._to, replace: true });
                } catch (error) {
                    // 移除 token 并跳转登录页
                    await useAuthStore().resetToken();
                    _next(`/login?redirect=${_to.path}`);
                }
            }
        }
    }
    NProgress.done();
});



/**
 * @description: 2.全局后置守卫
 * @author: Islands
 * @param {any} to
 * @param {any} from
 * @return {*}
 */
router.afterEach((_to: any, _from: any) => {
    //设置跳转路由后页面的标题
    document.title = (_to.meta.title ? _to.meta.title : '权限管理系统');
    NProgress.done();
});


